﻿Imports DevExpress.XtraGrid.Views.Grid

Public Class xtf_ABMasiento_
    Public PERMISONuevo As String = ""
    Public PERMISOModificar As String = ""
    Public PERMISOEliminar As String = ""
    Public PERMISOImprimir As String = ""


    Dim ulg_row As DataRow
    Dim obj_tercero As cls_tercero_ = Nothing
    Dim dtt_asiento_ As DataTable

    Public Sub New()
        InitializeComponent()
        AgregarValidaciones()

        PERMISONuevo = "012001002"
        PERMISOModificar = "012001003"
        PERMISOEliminar = "012001003"
        PERMISOImprimir = "012001003"

        'Prepara grid y datasource proveedorarticulo----------------------------------------------------
        dtt_asiento_ = New DataTable

        dtt_asiento_.Columns.Add("Identificador (ID)")
        dtt_asiento_.Columns.Add("Fecha", GetType(DateTime))
        dtt_asiento_.Columns.Add("Tipo")
        dtt_asiento_.Columns.Add("Número")
        dtt_asiento_.Columns.Add("TipoImporte", GetType(Integer))
        dtt_asiento_.Columns.Add("Ingreso", GetType(Decimal))
        dtt_asiento_.Columns.Add("Salida", GetType(Decimal))
        dtt_asiento_.Columns.Add("Observaciones")
        dtt_asiento_.Columns.Add("Concepto")
        dtt_asiento_.Columns.Add("Saldo", GetType(Decimal))
        dtt_asiento_.Columns.Add("Pendiente", GetType(Boolean))
        dtt_asiento_.Columns.Add("Vencimiento", GetType(DateTime))
        dtt_asiento_.Columns.Add("Objeto")

        gdc_general.DataSource = dtt_asiento_
        gdc_general.ForceInitialize()

        gdv_general.Columns("Objeto").Visible = False
        gdv_general.Columns("Tipo").Visible = False
        gdv_general.Columns("Pendiente").Visible = False

        gdv_general.PopulateColumns()
        gdv_general.Columns("TipoImporte").Visible = False
        gdv_general.Columns("Ingreso").AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far
        gdv_general.Columns("Ingreso").AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far
        gdv_general.Columns("Salida").AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far
        gdv_general.Columns("Salida").AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far


        gdv_general.Columns("Saldo").AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far
        gdv_general.Columns("Saldo").AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far

        FiltrarColumnas()
        cbo_filtro.SelectedIndex = 0
    End Sub

    Public Shadows Sub Modificar(ByRef tercero As cls_tercero_, ByRef listado As Form, ByRef row As DataRow)
        If IsNothing(obj_tercero) Then
            obj_tercero = New cls_tercero_
        End If
        obj_tercero = tercero
        frm_listado = listado
        ulg_row = row : bbi_imprimir.Enabled = True

        Select Case CType(listado, xtf_LISTADOasiento_).modo
            Case xtf_LISTADOasiento_.xtf_tipo.cliente
                Dim cliente As New cls_cliente_
                cliente.BuscarXidtercero(tercero.idtercero)
                txt_nombrefantasia.Text = cliente.nombrefantasia
                txt_razonsocial.Text = cliente.razonsocial
            Case xtf_LISTADOasiento_.xtf_tipo.proveedores
                Dim proveedor As New cls_proveedor_
                proveedor.BuscarXidtercero(tercero.idtercero)
                txt_nombrefantasia.Text = proveedor.nombrefantasia
                txt_razonsocial.Text = proveedor.razonsocial
        End Select


        Me.Text = "Cuenta Corriente - " & obj_tercero.ToString

        'CARGO TODA LA LISTA DE asientoS, Y SUS terceroasiento SI TIENE----------
        dtt_asiento_.Rows.Clear()

        Dim asiento_ As New cls_asiento_
        If asiento_.CargarXidtercero(obj_tercero.idtercero) Then
            For Each asiento As cls_asiento_ In asiento_.Items
                AgregarItem(asiento)
            Next
        End If
        '------------------------------------------------------------------------------
        CalcularSaldo()

        btn_Registro.Visible = False
        btn_guardarSalir.Visible = False
        btn_Guardar.Visible = False

        Me.Show()
    End Sub


    Public Function AgregarItem(ByRef asiento As cls_asiento_) As DataRow
        Dim dtt_row As DataRow = dtt_asiento_.NewRow
        dtt_row("Identificador (ID)") = asiento.idasiento
        dtt_row("Fecha") = asiento.fecha.ToShortDateString
        dtt_row("Tipo") = EnumDescription(asiento.tipo)
        If Not IsNothing(asiento.documento) Then
            dtt_row("Número") = Format(asiento.documento.numero, "0000000000")
        End If

        Select Case asiento.tipoimporte
            Case cls_asiento_.enu_tipoimporte.Ingreso
                dtt_row("Ingreso") = asiento.importe
                dtt_row("Salida") = 0
            Case cls_asiento_.enu_tipoimporte.Salida
                dtt_row("Salida") = asiento.importe
                dtt_row("Ingreso") = 0
        End Select
        If Not IsNothing(asiento.asientoconcepto) Then
            dtt_row("Concepto") = asiento.asientoconcepto.ToString
        End If
        dtt_row("TipoImporte") = asiento.tipoimporte
        dtt_row("Observaciones") = asiento.observaciones
        dtt_row("Saldo") = asiento.saldo
        dtt_row("Pendiente") = True
        dtt_row("Vencimiento") = asiento.vencimientoRE
        dtt_asiento_.Rows.Add(dtt_row)
        CalcularSaldo()
        Return dtt_row
    End Function

    Public Sub ModificarItem(ByRef asiento As cls_asiento_, ByRef dtt_row As DataRow)
        'dtt_row("Identificador (ID)") = asiento.idasiento
        'dtt_row("Fecha") = asiento.fecha.ToShortDateString
        'dtt_row("Tipo") = EnumDescription(asiento.tipo)
        'If Not IsNothing(asiento.documento) Then
        '    dtt_row("Número") = Format(asiento.documento.numero, "0000000000")
        'End If

        'Select Case asiento.tipoimporte
        '    Case cls_asiento_.enu_tipoimporte.Ingreso
        '        dtt_row("Ingreso") = asiento.importe
        '        dtt_row("Salida") = 0
        '    Case cls_asiento_.enu_tipoimporte.Salida
        '        dtt_row("Salida") = asiento.importe
        '        dtt_row("Ingreso") = 0
        'End Select
        'If Not IsNothing(asiento.asientoconcepto) Then
        '    dtt_row("Concepto") = asiento.asientoconcepto.ToString
        'End If
        'dtt_row("TipoImporte") = asiento.tipoimporte
        'dtt_row("Observaciones") = asiento.observaciones
        'asiento.calcularSaldo()
        'dtt_row("Saldo") = asiento.saldo
        'CalcularSaldo()
        Modificar(obj_tercero, frm_listado, ulg_row)
    End Sub

    Public Overrides Function ComprobarDatos() As Boolean
        If Not ControlarValidaciones() Then
            ErrManagerShow("000004", Me)
            Return False
        End If
        Return True
    End Function

    Public Shadows Sub btn_Guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Guardar.Click
        If ComprobarDatos() Then

        End If
    End Sub

    Private Sub btn_Cerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Cerrar.Click
        If frm_listado.Visible Then
            CType(frm_listado, xtf_LISTADOasiento_).ModificarItem(obj_tercero, ulg_row)
        End If
        guardar_config_usuariocolumna_()
        Me.Dispose()
    End Sub

    Private Sub guardar_config_usuariocolumna_()
        gdv_general.Columns("Pendiente").ClearFilter()
        gdv_general.Columns("Vencimiento").ClearFilter()
        gdv_general.OptionsFilter.AllowFilterEditor = False
        gdv_general.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never

        Dim obj_config_usuariocolumna_ As New cls_config_usuariocolumna_
        If obj_config_usuariocolumna_.Buscarxidusuarioxmodulo(UsuarioLOG.idusuario, Me.Name) Then
            obj_config_usuariocolumna_.xml = GetLayoutData(gdv_general)
            obj_config_usuariocolumna_.Modificar()
        Else
            obj_config_usuariocolumna_.xml = GetLayoutData(gdv_general)
            obj_config_usuariocolumna_.idusuario = UsuarioLOG.idusuario
            obj_config_usuariocolumna_.modulo = Me.Name
            obj_config_usuariocolumna_.Nuevo()
        End If
    End Sub

    Public Sub FiltrarColumnas()
        Dim int_IDUsuario As Integer = UsuarioLOG.idusuario
        Dim obj_config_usuariocolumna_ As New cls_config_usuariocolumna_
        gdv_general.BeginUpdate()
        If obj_config_usuariocolumna_.Buscarxidusuarioxmodulo(int_IDUsuario, Me.Name) Then
            SetLayoutData(gdv_general, obj_config_usuariocolumna_.xml)
        End If

        PerzonalizarControl(gdc_general)

        gdv_general.EndUpdate()
    End Sub

    Private Function GetLayoutData(ByRef prm_GridView As DevExpress.XtraGrid.Views.Grid.GridView) As Byte()
        Dim stream As New System.IO.MemoryStream()
        prm_GridView.SaveLayoutToStream(stream)
        Return stream.GetBuffer()
    End Function

    Private Sub SetLayoutData(ByRef prm_GridView As DevExpress.XtraGrid.Views.Grid.GridView, ByVal data As Byte())
        If data Is Nothing OrElse data.Length = 0 Then
            Return
        End If
        Dim stream As New System.IO.MemoryStream(data)
        Try
            prm_GridView.RestoreLayoutFromStream(stream)
        Catch ex As Exception
            Throw New Exception("Wrong data format", ex)
        End Try
    End Sub

    Private Sub CalcularSaldo()
        Dim Total As Decimal = 0
        For Each row As DataRow In dtt_asiento_.Rows
            Total += row("Ingreso")
            Total -= row("Salida")
        Next
        txt_total.Text = Total
    End Sub


    Private Sub tsb_asientoNuevo_Click(sender As System.Object, e As System.EventArgs) Handles tsb_asientoNuevo.Click
        If ComprobarPermiso(PERMISONuevo) Then
            Dim ABM As New xtf_ABMasiento
            ABM.Nuevo(Me, obj_tercero.idtercero)
            ABM.ControlarModificaciones(ABM.lac_general.Items)
            ABM.ShowDialog()
        End If
    End Sub

    Private Sub tsb_asientoModificar_Click(sender As System.Object, e As System.EventArgs) Handles tsb_asientoModificar.Click
        If ComprobarPermiso(PERMISOModificar) Then
            Try
                Dim asiento As New cls_asiento_
                If gdv_general.SelectedRowsCount > 0 Then
                    If asiento.Buscar(gdv_general.GetDataRow(gdv_general.GetSelectedRows(0))("Identificador (ID)")) Then
                        Dim ABM As New xtf_ABMasiento
                        ABM.Modificar(asiento, Me, gdv_general.GetDataRow(gdv_general.GetSelectedRows(0)))
                        ABM.ControlarModificaciones(ABM.lac_general.Items)
                        ABM.ShowDialog()
                    End If
                End If

            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If
    End Sub

    Private Sub tsb_asientoEliminar_Click(sender As System.Object, e As System.EventArgs) Handles tsb_asientoEliminar.Click
        If ComprobarPermiso(PERMISOEliminar) Then
            Try
                If gdv_general.SelectedRowsCount > 0 Then
                    If ErrManagerShow("000005", Me) = DialogResult.Yes Then
                        Dim eliminarRegistro As Boolean = False
                        If UsuarioLOG.esroot Then
                            If ErrManagerShow("001023", Me) = DialogResult.Yes Then
                                eliminarRegistro = True
                            End If
                        End If


                        Dim objeto As New cls_asiento_
                        objeto.Buscar(gdv_general.GetDataRow(gdv_general.GetSelectedRows(0))("Identificador (ID)"))

                        If objeto.tipo <> cls_documento_.enu_tipodocumento.Manual Then
                            Dim descripcion As String = "El asiento fue creado automaticamente al cargar "
                            Select Case objeto.tipo
                                Case cls_documento_.enu_tipodocumento.Caja
                                    descripcion &= "un asiento de caja."
                                Case cls_documento_.enu_tipodocumento.Compra
                                    descripcion &= "una compra."
                                Case cls_documento_.enu_tipodocumento.PedidoCliente
                                    descripcion &= "un pedido."
                            End Select
                            descripcion &= "#¿Desea eliminar el asiento conjunto a este documento?"
                            If ErrManagerShow("Asientos", descripcion, xtf_ErrManagerAlerta.errManagerImg.img_Advertencia, xtf_ErrManagerAlerta.errManagerBtn.btn_No & "," & xtf_ErrManagerAlerta.errManagerBtn.btn_Si) = Windows.Forms.DialogResult.No Then
                                Exit Sub
                            End If
                        End If

                        If eliminarRegistro Then
                            objeto.Eliminar(gdv_general.GetDataRow(gdv_general.GetSelectedRows(0))("Identificador (ID)"))
                            If objeto.iddocumento <> 0 Then
                                Select Case objeto.tipo
                                    Case cls_documento_.enu_tipodocumento.Caja
                                        Dim cajaasiento As New cls_cajaasiento_
                                        If cajaasiento.Buscar(objeto.iddocumento) Then
                                            cajaasiento.Eliminar(cajaasiento.idcajaasiento)
                                        End If
                                    Case Else
                                        Dim documento As New cls_documento_
                                        If documento.Buscar(objeto.iddocumento) Then
                                            documento.Eliminar(documento.iddocumento)
                                        End If
                                End Select
                            End If
                        Else
                            objeto.Buscar(gdv_general.GetDataRow(gdv_general.GetSelectedRows(0))("Identificador (ID)"))
                            objeto.registro.idregistroestado = 2
                            objeto.Modificar()

                            If objeto.iddocumento <> 0 Then
                                Select Case objeto.tipo
                                    Case cls_documento_.enu_tipodocumento.Caja
                                        Dim cajaasiento As New cls_cajaasiento_
                                        If cajaasiento.Buscar(objeto.iddocumento) Then
                                            cajaasiento.Eliminar(cajaasiento.idcajaasiento)
                                        End If
                                    Case Else
                                        Dim documento As New cls_documento_
                                        If documento.Buscar(objeto.iddocumento) Then
                                            documento.registro.idregistroestado = 2
                                            documento.Modificar()
                                        End If
                                End Select
                            End If

                        End If

                        dtt_asiento_.Rows.Remove(gdv_general.GetDataRow(gdv_general.GetSelectedRows(0)))
                    End If
                End If
                CalcularSaldo()
            Catch ex As Exception
                'Dim frmError As New frm_ErrorManager(ex.Message)
            End Try
        End If
    End Sub

    Private Sub cbo_filtro_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbo_filtro.SelectedIndexChanged
        'gdv_general.Columns ("Fecha").FilterInfo.
        Select Case cbo_filtro.SelectedIndex
            Case 0 'Todos
                gdv_general.Columns("Pendiente").ClearFilter()
                gdv_general.Columns("Vencimiento").ClearFilter()
            Case 1 'Pendientes
                gdv_general.Columns("Pendiente").ClearFilter()
                gdv_general.Columns("Vencimiento").ClearFilter()
                gdv_general.Columns("Pendiente").FilterInfo = New DevExpress.XtraGrid.Columns.ColumnFilterInfo("[Pendiente] = 1")
            Case 2 'Pendientes Mes
                gdv_general.Columns("Pendiente").ClearFilter()
                gdv_general.Columns("Vencimiento").ClearFilter()
                gdv_general.Columns("Pendiente").FilterInfo = New DevExpress.XtraGrid.Columns.ColumnFilterInfo("[Pendiente] = 'True'")
                gdv_general.Columns("Vencimiento").FilterInfo = New DevExpress.XtraGrid.Columns.ColumnFilterInfo("[Vencimiento] >= '" & New Date(Now.Year, Now.Month, 1) & "' and [Vencimiento] <='" & DateAdd(DateInterval.Day, -1, DateAdd(DateInterval.Month, 1, New Date(Now.Year, Now.Month, 1))) & "'")
        End Select
    End Sub
End Class